package perf.test.utils;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.util.HashMap;
import java.util.Map;
/**
* @author Nitesh Kant (nkant@netflix.com)
*/
public class ServiceResponseBuilder {
public static ByteArrayOutputStream buildTestAResponse(JsonFactory jsonFactory, BackendResponse[] orderedResponse)
throws IOException {
return buildTestAResponse(jsonFactory, orderedResponse[0], orderedResponse[1], orderedResponse[2],
orderedResponse[3], orderedResponse[4]);
}
public static ByteArrayOutputStream buildTestBResponse(JsonFactory jsonFactory, BackendResponse response)
throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
JsonGenerator jsonGenerator = jsonFactory.createJsonGenerator(bos);
jsonGenerator.writeStartObject();
// delay values of each response
jsonGenerator.writeArrayFieldStart("delay");
writeTuple(jsonGenerator, "a", response.getDelay());
jsonGenerator.writeEndArray();
// itemSize values of each response
jsonGenerator.writeArrayFieldStart("itemSize");
writeTuple(jsonGenerator, "a", response.getItemSize());
jsonGenerator.writeEndArray();
// numItems values of each response
jsonGenerator.writeArrayFieldStart("numItems");
writeTuple(jsonGenerator, "a", response.getNumItems());
jsonGenerator.writeEndArray();
// all items from responses
jsonGenerator.writeArrayFieldStart("items");
addItemsFromResponse(jsonGenerator, response);
jsonGenerator.writeEndArray();
jsonGenerator.writeEndObject();
jsonGenerator.close();
return bos;
}
public static ByteArrayOutputStream buildTestAResponse(JsonFactory jsonFactory,
BackendResponse responseA, BackendResponse responseB,
BackendResponse responseC, BackendResponse responseD,
BackendResponse responseE) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
JsonGenerator jsonGenerator = jsonFactory.createJsonGenerator(bos);
jsonGenerator.writeStartObject();
// multiplication of C, D, E responseKey
jsonGenerator.writeNumberField("responseKey", responseC.getResponseKey() + responseD.getResponseKey() +
responseE.getResponseKey());
// delay values of each response
jsonGenerator.writeArrayFieldStart("delay");
writeTuple(jsonGenerator, "a", responseA.getDelay());
writeTuple(jsonGenerator, "b", responseB.getDelay());
writeTuple(jsonGenerator, "c", responseC.getDelay());
writeTuple(jsonGenerator, "d", responseD.getDelay());
writeTuple(jsonGenerator, "e", responseE.getDelay());
jsonGenerator.writeEndArray();
// itemSize values of each response
jsonGenerator.writeArrayFieldStart("itemSize");
writeTuple(jsonGenerator, "a", responseA.getItemSize());
writeTuple(jsonGenerator, "b", responseB.getItemSize());
writeTuple(jsonGenerator, "c", responseC.getItemSize());
writeTuple(jsonGenerator, "d", responseD.getItemSize());
writeTuple(jsonGenerator, "e", responseE.getItemSize());
jsonGenerator.writeEndArray();
// numItems values of each response
jsonGenerator.writeArrayFieldStart("numItems");
writeTuple(jsonGenerator, "a", responseA.getNumItems());
writeTuple(jsonGenerator, "b", responseB.getNumItems());
writeTuple(jsonGenerator, "c", responseC.getNumItems());
writeTuple(jsonGenerator, "d", responseD.getNumItems());
writeTuple(jsonGenerator, "e", responseE.getNumItems());
jsonGenerator.writeEndArray();
// all items from responses
jsonGenerator.writeArrayFieldStart("items");
addItemsFromResponse(jsonGenerator, responseA);
addItemsFromResponse(jsonGenerator, responseB);
addItemsFromResponse(jsonGenerator, responseC);
addItemsFromResponse(jsonGenerator, responseD);
addItemsFromResponse(jsonGenerator, responseE);
jsonGenerator.writeEndArray();
jsonGenerator.writeEndObject();
jsonGenerator.close();
return bos;
}
private static void addItemsFromResponse(JsonGenerator jsonGenerator, BackendResponse a) throws IOException {
for (String s : a.getItems()) {
jsonGenerator.writeString(s);
}
}
private static void writeTuple(JsonGenerator jsonGenerator, String name, int value) throws IOException {
jsonGenerator.writeStartObject();
jsonGenerator.writeNumberField(name, value);
jsonGenerator.writeEndObject();
}
private static final OperatingSystemMXBean osStats = ManagementFactory.getOperatingSystemMXBean();
/**
* Add various headers used for logging and statistics.
*/
public static void addResponseHeaders(HttpServletResponse response, long startTime) {
Map<String, String> perfResponseHeaders = getPerfResponseHeaders(startTime);
for (Map.Entry<String, String> entry : perfResponseHeaders.entrySet()) {
response.addHeader(entry.getKey(), entry.getValue());
}
// all of them should be application/json
response.addHeader("content-type", "application/json");
}
public static Map<String, String> getPerfResponseHeaders(long startTime) {
Map<String, String> toReturn = new HashMap<String, String>();
toReturn.put("server_response_time", String.valueOf(System.currentTimeMillis() - startTime));
toReturn.put("os_arch", osStats.getArch());
toReturn.put("os_name", osStats.getName());
toReturn.put("os_version", osStats.getVersion());
toReturn.put("jvm_version", System.getProperty("java.runtime.version"));
// per core load average
int cores = Runtime.getRuntime().availableProcessors();
double loadAverage = osStats.getSystemLoadAverage();
double loadAveragePerCore = loadAverage / cores;
String l = String.valueOf(loadAveragePerCore);
if (l.length() > 4) {
l = l.substring(0, 4);
}
toReturn.put("load_avg_per_core", l);
return toReturn;
}
}